<?php
/**
 * User: yuesir
 * Date: 2016/4/27
 * Time: 21:19
 * 工厂方法：使用工厂方法的好处是，如果后期创建对象的方法有更改的时候，只需要修改一个地方即可。
 */
namespace Lib;

use Lib\Database\MySQLi;

class Factory {
    /**
     * 使用工厂模式来获取数据库对象
     * @return Database
     */
    public static function createDatabase()
    {
        $db = Database::getInstance();
        Register::set('db1', $db);
        return $db;
    }

    /**
     * @param $id
     * @return MySQLi
     * 数据库单例模式
     */
    public static function getDatabase($id = 'master')
    {
        $key = 'database_'.$id;
        if($id == 'slave') {
            $config = new Config(BASE_DIR.'/Config');
            $slaves = $config['database']['slave'];
            $db_conf = $slaves[array_rand($slaves)];
        } else {
            $config = new Config(BASE_DIR.'/Config');
            $db_conf = $config['database']['master'];
        }
        var_dump($db_conf);

        $db = Register::get($key);
        if(!$db) {
            $db = new Database\MySQLi();
            $db->connect($db_conf['host'], $db_conf['user'], $db_conf['password'], $db_conf['dbname']);
            Register::set($key, $db);
        }
        return $db;
    }

    /**
     * 获得模型实例
     * @param $name
     */
    public static function getModel($name)
    {
        $key = 'model_'.$name;
        $model = Register::get($key);
        if(!$model) {
            //这里应该还是通过将表映射成对象的属性来完成的，应该有一个抽象类，如果没有子类就直接使用抽象类
            //如果有子类就直接使用子类
            $model = new \stdClass();
        }

        return $model;
    }

    /**
     * @param $id
     * @return User
     * 将生成的对象注册到注册树上，当不存在的时候采取重新生成
     */
    public static function getUser($id)
    {
        $key = "user_".$id;
        $user = Register::get($key);
        if(!$user) {
            $user = new User($id);
            Register::set($key, $user);
        }

        return $user;
    }
}